www.gusucode.com > VC++网络版的打字软件源程序-源码程序 > VC++网络版的打字软件源程序-源码程序\code\TypeClt V2.0\Keyboard.cpp

    // Keyboard.cpp: implementation of the CKeyboard class.
// Download by http://www.NewXing.com
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "type.h"
#include "Keyboard.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define COLOR_L1		RGB(169,255,0)
#define COLOR_L2		RGB(255,169,169)
#define COLOR_L3		RGB(169,255,169)
#define COLOR_L4		RGB(169,169,255)

#define COLOR_R1		RGB(192,255,0)
#define COLOR_R2		RGB(255,192,192)
#define COLOR_R3		RGB(192,255,192)
#define COLOR_R4		RGB(192,192,255)

#define COLOR_CUR		RGB(196,196,196)

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CKeyboard::CKeyboard()
{
	//control row
	m_cChar=' ';
	
	//first row
	AddKey(0x00,0x00,1); //signal row change
	AddKey('`','~',10);
	AddKey('1','!',10);
	AddKey('2','@',10);
	AddKey('3','#',10);
	AddKey('4','$',10);
	AddKey('5','%',10);
	AddKey('6','^',10);
	AddKey('7','&',10);
	AddKey('8','*',10);
	AddKey('9','(',10);
	AddKey('0',')',10);
	AddKey('-','_',10);
	AddKey('=','+',10);
	AddKey(0x00,VK_BACK,-14); //backspace

	//second row
	AddKey(0x00,0x00,2); //signal row change
	AddKey(0x00,VK_TAB,14); //tab
	AddKey('q','Q',10,FINGER_LEFT_4);
	AddKey('w','W',10,FINGER_LEFT_3);
	AddKey('e','E',10,FINGER_LEFT_2);
	AddKey('r','R',10,FINGER_LEFT_1);
	AddKey('t','T',10,FINGER_LEFT_1);
	AddKey('y','Y',10,FINGER_RIGHT_1);
	AddKey('u','U',10,FINGER_RIGHT_1);
	AddKey('i','I',10,FINGER_RIGHT_2);
	AddKey('o','O',10,FINGER_RIGHT_3);
	AddKey('p','P',10,FINGER_RIGHT_4);
	AddKey('[','{',10);
	AddKey(']','}',10);
	AddKey('\\','|',-10);

	//third row
	AddKey(0x00,0x00,3); //signal row change
	AddKey(0x00,VK_CAPITAL,18); //caps lock
	AddKey('a','A',10,FINGER_LEFT_4);
	AddKey('s','S',10,FINGER_LEFT_3);
	AddKey('d','D',10,FINGER_LEFT_2);
	AddKey('f','F',10,FINGER_LEFT_1);
	AddKey('g','G',10,FINGER_LEFT_1);
	AddKey('h','H',10,FINGER_RIGHT_1);
	AddKey('j','J',10,FINGER_RIGHT_1);
	AddKey('k','K',10,FINGER_RIGHT_2);
	AddKey('l','L',10,FINGER_RIGHT_3);
	AddKey(';',':',10,FINGER_RIGHT_4);
	AddKey('\'','\"',10);
	AddKey(0x00,VK_RETURN,-16); //enter

	//fourth row
	AddKey(0x00,0x00,4); //signal row change
	AddKey(0x00,VK_SHIFT,22); //left shift
	AddKey('z','Z',10,FINGER_LEFT_4);
	AddKey('x','X',10,FINGER_LEFT_3);
	AddKey('c','C',10,FINGER_LEFT_2);
	AddKey('v','V',10,FINGER_LEFT_1);
	AddKey('b','B',10,FINGER_LEFT_1);
	AddKey('n','N',10,FINGER_RIGHT_1);
	AddKey('m','M',10,FINGER_RIGHT_1);
	AddKey(',','<',10,FINGER_RIGHT_2);
	AddKey('.','>',10,FINGER_RIGHT_3);
	AddKey('/','?',10,FINGER_RIGHT_4);
	AddKey(0x00,VK_SHIFT,-22); //shift

	//fifth row
	AddKey(0x00,0x00,5); //signal row change
	AddKey(0x00,VK_CONTROL,12); //ctrl
	AddKey(0x00,VK_LWIN,12); //window
	AddKey(0x00,VK_MENU,12); //alt
	AddKey(' ',' ',60);
	AddKey(0x00,VK_MENU,12);//alt
	AddKey(0x00,VK_RWIN,12);//window
	AddKey(0x00,VK_APPS,11);//App
	AddKey(0x00,VK_CONTROL,-12);//ctrl;

	CRect rc(0,0,200,60);
	Init(rc);

}

CKeyboard::~CKeyboard()
{
	POSITION pos = m_Keys.GetHeadPosition();
	while(pos)
	{
		delete m_Keys.GetNext(pos);
	}
}

void CKeyboard::AddKey(char cNormal, char cShifted, int nWidth, int nFinger)
{
	KEYDEF* pKey=new KEYDEF;
	pKey->cNormal=cNormal;
	pKey->cShifted=cShifted;
	pKey->nWidth=nWidth;
	pKey->nFinger=nFinger;
	m_Keys.AddTail(pKey);
}

void CKeyboard::CalcWidthHeight()
{
	m_nKeyHeight=0;
	m_nKeyWidth=0;
	KEYDEF* pKey;
	POSITION pos=m_Keys.GetHeadPosition();
	long totalWidth=0;
	long longest=0;
	long rows=0;

	while(pos)
	{
		pKey=m_Keys.GetNext(pos);
		
		if((pKey->cNormal==0x00)&&(pKey->cShifted==0x00))
		{
			rows++;
			if(totalWidth>longest)
			{
				longest=totalWidth;
			}
			totalWidth=0;
		}
		else
		{
			totalWidth+=abs(pKey->nWidth);
		}
	}

	m_nKeyHeight=m_Rect.Height()/rows;
	m_nKeyWidth=(int)(((double)m_Rect.Width())/(((double)longest)/15));
}

void CKeyboard::DrawKey(CDC *pDC, CRect &rc, KEYDEF *pKey, int nFlag)
{
	COLORREF clf=GetSysColor(COLOR_3DFACE);
	if(nFlag==0)
	{
		rc.DeflateRect(1,1);
		switch(pKey->nFinger)
		{
		case FINGER_LEFT_1:
			clf=COLOR_L1;
			break;
		case FINGER_RIGHT_1:
			clf=COLOR_R1;
			break;
		case FINGER_LEFT_2:
			clf=COLOR_L2;
			break;
		case FINGER_RIGHT_2:
			clf=COLOR_R2;
			break;
		case FINGER_LEFT_3:
			clf=COLOR_L3;
			break;
		case FINGER_RIGHT_3:
			clf=COLOR_R3;
			break;
		case FINGER_LEFT_4:
			clf=COLOR_L4;
			break;
		case FINGER_RIGHT_4:
			clf=COLOR_R4;
			break;
		}
		pDC->FillSolidRect(rc,clf);
		pDC->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
		rc.DeflateRect(1,1);
		pDC->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW));
	}
	else
	{
		rc.DeflateRect(1,1);
		clf=COLOR_CUR;
		pDC->FillSolidRect(rc,clf);
		pDC->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
		rc.DeflateRect(2,2);
		pDC->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW));
		rc.DeflateRect(1,1);
		pDC->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
	}

	rc.DeflateRect(3,1);
	if(pKey->cNormal == 0x00)
	{
		CString label = " ";
		
		switch(pKey->cShifted)
		{
		case VK_TAB:    
			label = "Tab->";
			break;
		case VK_CAPITAL:    
			label = "Caps";
			break;
		case VK_SHIFT:    
			label = "Shift";
			break;
		case VK_CONTROL:
			label = "Ctrl";
			break;
		case VK_BACK:    
			label = "<-Bspc";
			break;
		case VK_RETURN:    
			label = "Enter";
			break;
		case VK_MENU:
			label = "Alt";
			break;
		case VK_LWIN:
		case VK_RWIN:
			label = "Wnd";
			break;
		case VK_APPS:
			label = "App";
			break;
		case VK_ESCAPE:
			label = "Esc";
			break;
		default:
			ASSERT(FALSE);
			label = "#ERR#";
			break;
		}
		
		CSize tsize;
		tsize = pDC->GetTextExtent(label);
		pDC->TextOut(
			((rc.left + rc.right)/2) - (tsize.cx/2), 
			((rc.top + rc.bottom)/2) - (tsize.cy/2), 
			label);
	}
	else
	{
		if((pKey->cShifted >= 'A') && (pKey->cShifted <= 'Z'))
		{
			CSize tsize;
			tsize = pDC->GetTextExtent(pKey->cShifted);
			pDC->TextOut(
				((rc.left + rc.right)/2) - (tsize.cx/2), 
				((rc.top + rc.bottom)/2) - (tsize.cy/2), 
				pKey->cShifted);
			if(pKey->cShifted=='F' || pKey->cShifted=='J')
			{
				pDC->MoveTo(
					((rc.left+rc.right)/2)-(tsize.cx/2),
					((rc.top+rc.bottom)/2)+(tsize.cy/2));
				pDC->LineTo(
					((rc.left+rc.right)/2)+(tsize.cx/2),
					((rc.top+rc.bottom)/2)+(tsize.cy/2));
			}
		}
		else
		{
			CSize tsize;
			tsize = pDC->GetTextExtent('M');
			pDC->TextOut(rc.left, rc.top, pKey->cShifted);
			pDC->TextOut(
				rc.right - tsize.cx, 
				rc.bottom - tsize.cy,
				pKey->cNormal);
		}
	}
}

void CKeyboard::DrawKeyboard(CDC* pDC,CRect& rc)
{
	Init(rc);//初始化键盘

	pDC->FillSolidRect(m_Rect,GetSysColor(COLOR_3DFACE));
	
	int nBM=pDC->SetBkMode(TRANSPARENT);

	int x = m_Rect.left;
	int y = m_Rect.top-m_nKeyHeight;

	int nFlag=0;
	KEYDEF * pKey;
	POSITION pos = m_Keys.GetHeadPosition();

	while(pos)
	{
		pKey = m_Keys.GetNext(pos);
		if((pKey->cNormal == 0x00) && (pKey->cShifted == 0x00))
		{
			
			x = m_Rect.left;
			y += m_nKeyHeight;
		}
		else
		{
			int width = ((abs(pKey->nWidth) * m_nKeyWidth) / 15);
			CRect rcKey(x,y,x + width, y + m_nKeyHeight);
			x += width;
			if(pKey->nWidth < 0)
			{
				rcKey.right = rc.right; 
			}
			
			if(m_cChar!=0x00 &&(pKey->cNormal==m_cChar || pKey->cShifted==m_cChar))
			{
				nFlag=1;
			}
			else
			{
				nFlag=0;
			}
			DrawKey(pDC, rcKey, pKey, nFlag);
		}
	}
	pDC->SetBkMode(nBM);

}

void CKeyboard::Init(CRect &rc)
{
	m_Rect=rc;
	CalcWidthHeight();
}